package com.wy.jfree_chart;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.Random;

public class LineChartToImage {

    public static void main(String[] args) {
        // 创建数据集
        XYDataset dataset = createDataset();
        
        // 创建图表
        JFreeChart chart = createChart(dataset);

        // 保存为图片文件
        saveChartAsImage(chart);
        
        System.out.println("折线图已保存为 line-chart.png");
    }

    private static XYDataset createDataset() {
        // 创建数据系列
        XYSeries series1 = new XYSeries("2023年销售额");
        XYSeries series2 = new XYSeries("2024年销售额");
        XYSeries series3 = new XYSeries("2025年预测");
        
        Random random = new Random();
        double baseValue2023 = 100;
        double baseValue2024 = 120;
        
        // 生成2023年数据（实际数据）
        for (int i = 1; i <= 12; i++) {
            double value = baseValue2023 + (random.nextDouble() - 0.3) * 40;
            series1.add(i, Math.round(value * 10) / 10.0); // 保留一位小数
        }
        
        // 生成2024年数据（实际数据）
        for (int i = 1; i <= 12; i++) {
            double value = baseValue2024 + (random.nextDouble() - 0.3) * 50;
            series2.add(i, Math.round(value * 10) / 10.0);
        }
        
        // 生成2025年预测数据（趋势增长）
        for (int i = 1; i <= 12; i++) {
            double value = 140 + (i * 2) + (random.nextDouble() - 0.5) * 20;
            series3.add(i, Math.round(value * 10) / 10.0);
        }
        
        // 将系列添加到数据集
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);
        dataset.addSeries(series2);
        dataset.addSeries(series3);
        
        return dataset;
    }

    private static JFreeChart createChart(XYDataset dataset) {
        // 创建折线图
        JFreeChart chart = ChartFactory.createXYStepAreaChart(
                "公司年度销售趋势分析",     // 图表标题
                "月份",                   // X轴标签
                "销售额 (万元)",          // Y轴标签
                dataset,                 // 数据集
                PlotOrientation.VERTICAL, // 图表方向
                true,                    // 是否显示图例
                true,                    // 是否生成工具提示
                false                    // 是否生成URL链接
        );

        setChineseFont(chart);
        // 自定义图表外观
        XYPlot plot = chart.getXYPlot();
        
        // 设置背景颜色
        plot.setBackgroundPaint(Color.WHITE);
        plot.setDomainGridlinePaint(Color.LIGHT_GRAY);
        plot.setRangeGridlinePaint(Color.LIGHT_GRAY);
        
        // 设置抗锯齿，使文字更清晰
        chart.setTextAntiAlias(true);
        
        // 设置线条渲染器
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        
        // 为不同系列设置不同的颜色和样式
        renderer.setSeriesPaint(0, new Color(70, 130, 180));    // 钢蓝色 - 2023年
        renderer.setSeriesPaint(1, new Color(220, 20, 60));     // 深红色 - 2024年
        renderer.setSeriesPaint(2, new Color(34, 139, 34));     // 森林绿 - 2025年预测
        
        // 设置线条粗细
        renderer.setSeriesStroke(0, new BasicStroke(2.5f));
        renderer.setSeriesStroke(1, new BasicStroke(2.5f));
        renderer.setSeriesStroke(2, new BasicStroke(2.0f, BasicStroke.CAP_ROUND, 
                BasicStroke.JOIN_ROUND, 1.0f, new float[]{5.0f, 5.0f}, 0.0f)); // 虚线
        
        // 显示数据点形状
        renderer.setSeriesShapesVisible(0, true);
        renderer.setSeriesShapesVisible(1, true);
        renderer.setSeriesShapesVisible(2, true);
        
        plot.setRenderer(renderer);
        
        return chart;
    }

    private static void saveChartAsImage(JFreeChart chart) {
        try {
            // 保存为PNG格式
            File file = new File("output/line-chart.png");
            ChartUtils.saveChartAsPNG(file, chart, 1000, 600);
            
            // 也可以保存为JPEG格式
            // File jpegFile = new File("line-chart.jpg");
            // ChartUtils.saveChartAsJPEG(jpegFile, chart, 1000, 600);
            
        } catch (IOException e) {
            System.err.println("保存图片时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }


    private static void setChineseFont(JFreeChart chart) {
        // 获取系统支持的中文字体
        Font chineseFont = getSupportedChineseFont();

        // 设置标题字体
        chart.getTitle().setFont(chineseFont.deriveFont(Font.BOLD, 20));

        // 设置图例字体
        chart.getLegend().setItemFont(chineseFont.deriveFont(Font.PLAIN, 14));

        // 设置坐标轴字体
        XYPlot plot = chart.getXYPlot();
        plot.getDomainAxis().setLabelFont(chineseFont.deriveFont(Font.BOLD, 14));
        plot.getDomainAxis().setTickLabelFont(chineseFont.deriveFont(Font.PLAIN, 12));
        plot.getRangeAxis().setLabelFont(chineseFont.deriveFont(Font.BOLD, 14));
        plot.getRangeAxis().setTickLabelFont(chineseFont.deriveFont(Font.PLAIN, 12));
    }

    private static Font getSupportedChineseFont() {
        // 尝试使用系统支持的中文字体
        String[] fontNames = {
                "Microsoft YaHei",    // 微软雅黑
                "SimHei",             // 黑体
                "SimSun",             // 宋体
                "KaiTi",              // 楷体
                "FangSong",           // 仿宋
                "PingFang SC",        // 苹方 (Mac)
                "Hiragino Sans GB",   // 冬青黑体 (Mac)
                "WenQuanYi Micro Hei", // 文泉驿微米黑 (Linux)
                "DejaVu Sans"         // 备选字体
        };

        for (String fontName : fontNames) {
            Font font = new Font(fontName, Font.PLAIN, 12);
            if (font.canDisplay('中') && font.canDisplay('文')) {
                System.out.println("使用字体: " + fontName);
                return font;
            }
        }

        // 如果没有找到合适的中文字体，使用默认字体
        System.out.println("未找到合适的中文字体，使用默认字体");
        return new Font("SansSerif", Font.PLAIN, 12);
    }
    
    // 可选：创建多个不同尺寸的图片
    private static void saveMultipleSizes(JFreeChart chart) {
        try {
            // 大尺寸 - 用于报告
            ChartUtils.saveChartAsPNG(new File("line-chart-large.png"), chart, 1200, 800);
            
            // 中等尺寸 - 一般使用
            ChartUtils.saveChartAsPNG(new File("line-chart-medium.png"), chart, 800, 500);
            
            // 小尺寸 - 缩略图
            ChartUtils.saveChartAsPNG(new File("line-chart-small.png"), chart, 400, 250);
            
        } catch (IOException e) {
            System.err.println("保存多尺寸图片时出错: " + e.getMessage());
        }
    }
}